package main

import (
	"crypto/ecdsa"
	"crypto/elliptic"
	"crypto/rand"
	"crypto/sha256"
	"fmt"
	"log"
	"math/big"
)

// 1 演示如何使用ecdsa生成公钥私钥
// 2 签名校验
func main() {
	// 创建曲线
	curve := elliptic.P256()
	// 生成私钥
	privateKey, err := ecdsa.GenerateKey(curve, rand.Reader)
	if err != nil {
		log.Panic()
	}
	// 生成公钥
	pubKey := privateKey.PublicKey

	data := "hello world"  // 准备签名数据
	hash := sha256.Sum256([]byte(data))

	// 签名
	r, s, err := ecdsa.Sign(rand.Reader, privateKey, hash[:])
	if err != nil {
		log.Panic()
	}
	fmt.Printf("pubkey: %v\n", pubKey)
	fmt.Printf("r: %v\n", r.Bytes())  // 长度为32
	fmt.Printf("r: %v\n", s.Bytes())  // 长度为32

	// 把r，s进行序列化传输
	signature := append(r.Bytes(), s.Bytes()...)  // r, s 长度一样

	// -------------------  经过网络传输 ^_^  ------------------------

	// 1 定义两个辅助的big.Int
	r1 := big.Int{}
	s1 := big.Int{}
	// 2 拆分我们signature, 前半部分为r,后半部分为s
	r1.SetBytes(signature[:len(signature)/2])
	s1.SetBytes(signature[len(signature)/2:])

	// 校验需要三个东西: 数据、签名、公钥
	//res := ecdsa.Verify(&pubKey, hash[:], r, s)
	res := ecdsa.Verify(&pubKey, hash[:], &r1, &s1)
	fmt.Printf("校验结果 %v\n", res)
}



